package com.jason.rxjavatest;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;
import rx.functions.Func1;

/**
 * test1 参考大头鬼博文
 *
 * @Author: Jason
 * @Date: 16/4/28
 * @Time: 11:57
 */

public class RxJavaTest1 extends AppCompatActivity {

    private static final String TAG = RxJavaTest1.class.getSimpleName();
    private TextView tv_content;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_rxjava);
        tv_content = (TextView) findViewById(R.id.tv_content);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(RxJavaTest1.this, RxJavaTest02.class));
            }
        });


        /**
         * Observables（被观察者，事件源）  Observables发出一系列事件  Subscribers处理这些事件
         */
        // 第一种创建方式
       /* Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello RxJava  Observable1");
                subscriber.onCompleted();
            }
        });*/


        // 第二种创建方式
        Observable<String> myObservable = Observable.just("hello RxJava Observable2");

        /**
         * Subscribers（观察者）
         */
        Subscriber<String> mySubscriber = new Subscriber<String>() {


            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError");
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "onNext   s  " + s);
                tv_content.setText(s);
            }
        };


        /**
         * 其实并不关心OnComplete和OnError，
         * 我们只需要在onNext的时候做一些处理，
         * 这时候就可以使用Action1类。
         */
        Action1<String> onNextAction = new Action1<String>() {
            @Override
            public void call(String s) {
                Log.e("TAG", "onNextAction----->" + s);
                tv_content.setText(s);
            }
        };


        //myObservable.subscribe(mySubscriber);
        myObservable.subscribe(onNextAction);


        // 第三种创建方式
        Observable.just("Hello RxJava Observable3")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "s----->" + s);
                        tv_content.setText(s);
                    }
                });


        /**
         * 操作符就是为了解决对Observable对象的变换的问题，
         * 操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件
         */


        /**
         * map()操作符就是用于变换Observable对象的，
         *
         * map操作符返回一个Observable对象，这样就可以实现链式调用，
         * 在一个Observable对象上多次使用map操作符，
         * 最终将最简洁的数据传递给Subscriber对象。
         * map操作符的作用就是将一个事件转换成另一个事件
         */
        // 操作符  map 1
        Observable.just("Hello Rxjava!")
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        return s + "map操作符";
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "map操作符-----s-----" + s);
                        tv_content.setText(s);
                    }
                });


        // map操作符进阶
        /**
         * map操作符更有趣的一点是它不必返回Observable对象返回的类型,你可以使用map操作符返回一个发出新的数据类型的observable对象
         * 比如上面的例子中，subscriber并不关心返回的字符串,而是想要字符串的hash值
         */
        Observable.just("Hello,Rxjava!")
                .map(new Func1<String, Integer>() {
                    @Override
                    public Integer call(String s) {
                        return s.hashCode();
                    }
                })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.e(TAG, "map操作符改变返回类型-----integer-----" + integer); // 431018849
                        tv_content.setText("map修改Observable返回的类型展示值:--->" + integer);
                    }
                });


        // map操作符进阶  两个map操作的使用
        Observable.just("Hello RxJava!")
                .map(new Func1<String, Integer>() {
                    @Override
                    public Integer call(String s) {
                        return s.hashCode();
                    }
                })
                .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return integer.toString();
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "双个map操作符改变返回类型-----s-----" + s); //
                        tv_content.setText(s);
                    }
                });


        // map操作符进阶  两个map操作的使用
        Observable.just("Hello RxJava!")
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        return s;
                    }
                })
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String integer) {
                        return integer;
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "双个map操作符改变返回类型-----str-----" + s); // Hello RxJava!
                        tv_content.setText(s);
                    }
                });


    }


}
